SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
CREATE PROCEDURE [dbo].[sp_Audit_insTrigger] 
@tabla varchar(128),
@evento varchar(1) --UPDATE, DELETE, INSERT: siempre la primera LETRA,

/****************************************************************************************/
/*LA FINALIDAD DE ESTE PROCESO ES GENERAR DESENCADENADORES EN FUNCION DE LA ESTRUCTURA  
DE LA TABLA EL TIPO DE EVENTO QUE DESEAMOS AUDITAR. HEMOS ASUMIDO QUE DICHA TABLA DEBE CUMPLIR CON LA CONDICION DE QUE 
SU CLAVE PRIMARIA (PK) ESTE CONFORMADA POR UN SOLO CAMPO DEL TIPO "AUTONUMERICO".
ESTO ES EQUIVALENTE A DECIR QUE ESTA TABLA TIENE UN TIPO DE INDICE DEL TIPO       
NOTA: ES POSIBLE AUDITAR TABLAS CUYA PK ESTE CONFORMADA POR MAS 
DE UN CAMPO Y OBTENIENDO LOS CUALES A TRAVES DE UN "BUCLE" EN LA sysindexkeys LO CUAL
IMPLICARIA UN REGISTRO ADICIONAL EN tb_sucesos POR CADA CAMPO QUE FORME PARTE DE LA PK, 
Y POR CADA CAMPO DE LA TABLA A AUDITAR .................
REF. 20060915 - ROBERTO                                                                 */
/****************************************************************************************/
AS
declare @nombTrigger as varchar(50)
declare @prefijo as varchar(9)
declare @ncPK as int --nombre del campo PK de la tabla que se quiere auditar
declare @ic as int --identificador de columna en syscolumns
declare @nc as varchar(128)--nombre de columna en syscolumns
declare @td as varchar(128)--tipo de datos de la columna en systypes
declare @lc as int--longitud del tipo de datos
declare @strSQL as varchar(8000)--aqui vamos generando la consulta
								--de creacion del trigger
declare @strSQL_1 as varchar(8000)
declare @strSQL_2 as varchar(8000)
declare @strSQL_3 as varchar(8000)
declare @strSQL_4 as varchar(8000)
declare @aux as varchar(8000)
--ACLARACION: los tipos de datos varchar pueden solo tener como maximo 8000 caracteres(NO UNICODE).
--Estuve probando con el tipo de datos ntext el cual no 
--tiene limites (aparentemente no hay problema si se superan los 4000 caracters UNICODE) 
--pero se puede usar solo como tipo de datos en la declaración (o el diseño) de la estructura de una tabla.
--(Se podria crear una tabla temporal con un solo campo que tenga este tipo de datos NTEXT ó TEXT
--e ir almacenando la intruccion que se va generando en funcion de la estructura de la tabla)


declare @accion as varchar(30)
--VOY A PROCESAR EN FUNCION DEL EVENTO A AUDITAR
--(A GENERAR LOS TRIGGER'S)
begin tran
IF @evento='I' 
	begin
	set @prefijo='AuditINS_'
	set @accion='INSERT'
	end
IF @evento='D' 
	begin	
	set @prefijo='AuditDEL_'
	set @accion='DELETE'
	end
IF @evento='U' 
	begin
	set @prefijo='AuditUPD_'
	set @accion='UPDATE'
	end
set @tabla=ltrim(rtrim(@tabla))
set @evento=upper(@evento)
set @nombTrigger='dbo.'+ltrim(rtrim(@prefijo+ltrim(rtrim(@tabla))))
--POR LAS DUDAS VOY A BORRAR PRIMERAMENTE SI ES QUE EXISTEN TODOS LOS TRIGGERS
--exec sp_Audit_delTrigger @tabla
--LA LONGITUD DE LA CADENA ES DE 8000
--ENTONCES VOY A CONCATENAR SI LA LONGITUD DE LA INSTRUCCION (LA QUE ME VA A GENERAR EL TRIGGER)
--ES MAYOR A 8000. LA INSTRUCCION LA VOY GENERANDO EN LA VBLE @lcad
set @strSQL_1=' '
set @strSQL_2=' '
set @strSQL_3=' '
set @strSQL_4=' ' --NOTA .. POR AHORA NO LA UTILIZO
set @strSQL='create Trigger '+@nombTrigger + ' on ' +  @tabla + ' FOR ' + @accion
set @strSQL=@strSQL+ ' as '
declare @long as int 
declare @lCad as int
declare @idcol_campo_clave int
declare @nomb_campo_clave varchar(128)
declare @cad as varchar(8000)
IF @evento='U'
	begin
	--desarrollamos el trigger FOR UPDATE
	/********* 1º obtenemos el nombre del campo que es "clave" en la tabla */
	--NOTA: hemos asumido que la PK esta formada x un solo campo del tipo "autonumerico"
	
	set @idcol_campo_clave=(select colid from sysindexkeys where id=object_id(@tabla) 
							and indid =(select indid from sysindexes where 
										id=object_id(@tabla) and name like 'PK_'+'%'))
	--LA VBLE. @idcol_campo_clave nos servira para identificar los atributos de la columna clave										
	--en la syscolumns
										
	--NOTA2: la instruccion anterior solo es valida cuando el nombre de la pk comienza con 'PK_ ...'
	--con lo cual asumimos que es la clave primaria.
	--Esta forma de recuperar la clave quedó sujeto a revisión puesto que el nombre del campo clave
	--puede modificarse en cualquier momento. Esto podría siimplificarce si creamos el campo clave
	--desde la vista "diseño" de la tabla, ya que de esta forma el campo se marca como "CLUSTERED" 
	--con lo que en la sysindexes el campo indid=1. 
	
	--NOTA3: la columna keycnt de la sysindexes nos devuelve la cantidad de cols que forman 
	--parte de la clave ... esto nos serviria para cancelar todo el proceso en caso que sea > 1
	--siempre suponiendo que el nombre de la clave (compuesta o no ) comience con 'PK_ ...'
	declare @cant_cols_claves as int
	select @cant_cols_claves=keycnt from sysindexes where name like 'PK_'+'%' and id=object_id(@tabla)
	
	--NOTA4: nos esta faltanto controlar que ademas de ser campo clave con columna única
	--sea del tipo autonumerico. (SOLO PUEDE HABER UN SOLO CAMPO CON ATRIBUTO "IDENTIDAD (AUTONUM)" POR TABLA)
	--Este dato nos devuelve la columan "colstat" de la syscolumns.
	declare @colstat smallint
	set @colstat=(select colstat FROM syscolumns
		WHERE (id = OBJECT_ID(@tabla)) and colid = @idcol_campo_clave)
	
	set @nomb_campo_clave=(select name from syscolumns where colid=@idcol_campo_clave and id=object_id(@tabla))
	
	/********* Declaramos el cursor con la estructura de la tabla          */
	--el sgte cursor tiene: idcampo, nombcampo, tipodato, long de la estruc. de	tabla
	declare cols cursor for
		SELECT colid,name,
		(select name from systypes where xusertype=syscolumns.xtype) as tipo, 
		length FROM syscolumns
		WHERE (id = OBJECT_ID(@tabla)) and colid <> @idcol_campo_clave
		--esta ultima condicion (colid <> ... ) la indicamos ya que no vamos a auditar o
		--registrar los cambios que se produzcan en el campo clave ya que no se permite 
		--modificar este tipo de campo (autonumerico), como lo asumimos desde el principio
		--NOTA 03/09/2007: tb podriamos traer este ultimo dato para verificar que el tipo de 
		--dato del campo clave sea numerico (int) ... (aqui el campo xtype de la syscolumns debe ser 56)
		--para el campo clave
		order by colid
	
	set @strSQL=@strSQL+'DECLARE @A AS varchar(200) '
	set @strSQL=@strSQL+'DECLARE @D AS varchar(200) '
	set @strSQL=@strSQL+'DECLARE @AUX1 AS varchar(200) '
	set @strSQL=@strSQL+'DECLARE @AUX2 AS varchar(200) '
	set @strSQL=@strSQL+'DECLARE @ID AS BIGINT '
	set @lcad=len(@strSQL)
	open cols
	fetch next from cols into @ic, @nc, @td, @lc 
	--ID del registro, nombre Campo,
	--tipo de dato, y longitud del tipo de dato
	while @@fetch_status=0
		begin
		if @lcad<7000
			begin	
			set @strSQL=@strSQL+' IF UPDATE('+@nc+') BEGIN '
			set @strSQL=@strSQL+'DECLARE @'+@nc+' '+@td
			if ltrim(rtrim(upper(@td))) in ('CHAR','VARCHAR','NCHAR','NVARCHAR')
				--para estos tipos de datos requieren en la declaracion que se indique
				--la longitud del tipo de datos
				begin
				set @strSQL=@strSQL+'('+cast(@lc as varchar(10))+') '		
				end
			--UTILIZAMOS UN CURSOR PARA EL CASO DE QUE SE HAYAN ACTUALIZADO MAS DE UNA FILA 
			--PARA ESE CAMPO ....
			set @strSQL=@strSQL+' DECLARE CUR CURSOR FOR SELECT '+@nomb_campo_clave+','+@nc+' FROM DELETED OPEN CUR FETCH NEXT FROM CUR INTO @ID,@'+@nc
			set @strSQL=@strSQL+' WHILE @@FETCH_STATUS=0 BEGIN '
			set @strSQL=@strSQL+' SET @A=CAST(@'+@nc+' AS varchar(200))'
			set @strSQL=@strSQL+' SET @D=CAST((SELECT '+@nc+' FROM '+@tabla+' WHERE '+@nomb_campo_clave+'=@ID) AS varchar(200)) ' 	
			SET @strSQL=@strSQL+' SET @AUX1= ISNULL(@A,'+char(39)+'0'+char(39)+') '
			SET @strSQL=@strSQL+' SET @AUX2= ISNULL(@D,'+char(39)+'0'+char(39)+') '	
			--LA SGTE INSTRUCCION "IF" ES PARA QUE SOLO SE INSERTEN EN LA TABLA TB_SUCESOS CUANDO  REALMENTE
			--EL VALOR ANTERIOR AL CAMPO Y EL ACTUAL SEAN DISTINTOS, PUESTO QUE EN LA TABLA "DELETED" SE ENCUENTA
			--TODO EL CONTENIDO DEL REGISTRO QUE FUE REEMPLAZADO.
			--LA OPERACION DE ACTUALIZACION EN REALIDAD LO QUE HACE ES INSERTAR UN NUEVO REGISTRO
			--EN LA TABLA, CON LOS NUEVOS VALORES DE LOS CAMPOS QUE SE ACTUALIZARON, ASI SE HAYA ACTUALIZADO
			--UN SOLO CAMPO. 
			--EL REGISTRO QUE FUE REEMPLAZADO ESTA EN ESTE MOMENTO EN LA TABLA DELETED.
			--PUESTO QUE ESTA OPERACION (EL REGISTRO DE LA ACTUALIZACION) ES A NIVEL DE CAMPO, Y POR CADA CAMPO
			--GENERAMOS UN REGISTRO EN LA TB_SUCESOS, NO NOS INTERESA AQUELLOS CAMPO QUE NO SUFRIERON MODIFICACIONES.
			--ESTA ES LA RAZON DE LA SIGUIENTE COMPARACION... (ROBERTO 03/09/2007)
			--ESTA COMPARACION LA HACEMOS EN TODOS LOS "IF" POR DONDE ENTREMOS, SEGUN LA LONGITUD DE LA CADENA
			set @strSQL=@strSQL+' IF @AUX1<> @AUX2 INSERT INTO TB_SUCESOS (ACCION,TABLA,PK_ID,PK_nombre,NOMB_CAMPO_AUDIT,ANTES,DESPUES,FECHASUCESO,BDUSER,SYSUSER) VALUES ('+char(39)+'U'+char(39)+','+char(39)+@tabla+char(39)+',@ID,'+char(39)+@nomb_campo_clave+char(39)+','+char(39)+@nc+char(39)+',@A,@D,GETDATE(),CURRENT_USER,SYSTEM_USER)'
			set @strSQL=@strSQL+' FETCH NEXT FROM CUR INTO @ID, @'+@nc+' END '
			set @strSQL=@strSQL+' CLOSE CUR DEALLOCATE CUR END '	
			select @lcad=len(@strSQL)
			--PRINT @STRSQL
			goto next_record
			end
		
		if @lcad>=7000 and @lcad<14000
			begin
			set @strSQL_1=@strSQL_1+' IF UPDATE('+@nc+') BEGIN '
			set @strSQL_1=@strSQL_1+'DECLARE @'+@nc+' '+@td
			if ltrim(rtrim(upper(@td))) in ('CHAR','VARCHAR','NCHAR','NVARCHAR')
				--para estos tipos de datos requieren en la declaracion que se indique
				--la longitud del tipo de datos
				begin
				set @strSQL_1=@strSQL_1+'('+cast(@lc as varchar(10))+') '		
				end
			set @strSQL_1=@strSQL_1+' DECLARE CUR CURSOR FOR SELECT '+@nomb_campo_clave+','+@nc+' FROM DELETED OPEN CUR FETCH NEXT FROM CUR INTO @ID,@'+@nc
			set @strSQL_1=@strSQL_1+' WHILE @@FETCH_STATUS=0 BEGIN '
			set @strSQL_1=@strSQL_1+' SET @A=CAST(@'+@nc+' AS varchar(200))'
			set @strSQL_1=@strSQL_1+' SET @D=CAST((SELECT '+@nc+' FROM '+@tabla+' WHERE '+@nomb_campo_clave+'=@ID) AS varchar(200)) ' 	
			SET @strSQL_1=@strSQL_1+' SET @AUX1= ISNULL(@A,'+char(39)+'0'+char(39)+') '
			SET @strSQL_1=@strSQL_1+' SET @AUX2= ISNULL(@D,'+char(39)+'0'+char(39)+') '	
			set @strSQL_1=@strSQL_1+' IF @AUX1<> @AUX2 INSERT INTO TB_SUCESOS (ACCION,TABLA,PK_ID,PK_nombre,NOMB_CAMPO_AUDIT,ANTES,DESPUES,FECHASUCESO,BDUSER,SYSUSER) VALUES ('+char(39)+'U'+char(39)+','+char(39)+@tabla+char(39)+',@ID,'+char(39)+@nomb_campo_clave+char(39)+','+char(39)+@nc+char(39)+',@A,@D,GETDATE(),CURRENT_USER,SYSTEM_USER)'
			set @strSQL_1=@strSQL_1+' FETCH NEXT FROM CUR INTO @ID, @'+@nc+' END '
			set @strSQL_1=@strSQL_1+' CLOSE CUR DEALLOCATE CUR END '	
			select @lcad=len(@strSQL)+len(@strSQL_1)
			--PRINT @STRSQL + @STRSQL_1 + '-- FIN BUCLE 7000 A 14000 '
			goto next_record
			end
		if @lcad>=14000 and @lcad<21000
			begin
			set @strSQL_2=@strSQL_2+' IF UPDATE('+@nc+') BEGIN '
			set @strSQL_2=@strSQL_2+'DECLARE @'+@nc+' '+@td
			if ltrim(rtrim(upper(@td))) in ('CHAR','VARCHAR','NCHAR','NVARCHAR')
				--para estos tipos de datos requieren en la declaracion que se indique
				--la longitud del tipo de datos
				begin
				set @strSQL_2=@strSQL_2+'('+cast(@lc as varchar(10))+') '		
				end
			set @strSQL_2=@strSQL_2+' DECLARE CUR CURSOR FOR SELECT '+@nomb_campo_clave+','+@nc+' FROM DELETED OPEN CUR FETCH NEXT FROM CUR INTO @ID,@'+@nc
			set @strSQL_2=@strSQL_2+' WHILE @@FETCH_STATUS=0 BEGIN '
			set @strSQL_2=@strSQL_2+' SET @A=CAST(@'+@nc+' AS varchar(200))'
			set @strSQL_2=@strSQL_2+' SET @D=CAST((SELECT '+@nc+' FROM '+@tabla+' WHERE '+@nomb_campo_clave+'=@ID) AS varchar(200)) ' 	
			SET @strSQL_2=@strSQL_2+' SET @AUX1= ISNULL(@A,'+char(39)+'0'+char(39)+') '
			SET @strSQL_2=@strSQL_2+' SET @AUX2= ISNULL(@D,'+char(39)+'0'+char(39)+') '	
			set @strSQL_2=@strSQL_2+' IF @AUX1<> @AUX2 INSERT INTO TB_SUCESOS (ACCION,TABLA,PK_ID,PK_nombre,NOMB_CAMPO_AUDIT,ANTES,DESPUES,FECHASUCESO,BDUSER,SYSUSER) VALUES ('+char(39)+'U'+char(39)+','+char(39)+@tabla+char(39)+',@ID,'+char(39)+@nomb_campo_clave+char(39)+','+char(39)+@nc+char(39)+',@A,@D,GETDATE(),CURRENT_USER,SYSTEM_USER)'
			set @strSQL_2=@strSQL_2+' FETCH NEXT FROM CUR INTO @ID, @'+@nc+' END '
			set @strSQL_2=@strSQL_2+' CLOSE CUR DEALLOCATE CUR END '	
			select @lcad=len(@strSQL_2)+len(@strSQL)+len(@strSQL_1)
			--PRINT @STRSQL + @STRSQL_1 + @STRSQL_2
			goto next_record
			end
		if @lcad>=21000 and @lcad<28000
			begin
			set @strSQL_3=@strSQL_3+' IF UPDATE('+@nc+') BEGIN '
			set @strSQL_3=@strSQL_3+'DECLARE @'+@nc+' '+@td
			if ltrim(rtrim(upper(@td))) in ('CHAR','VARCHAR','NCHAR','NVARCHAR')
				--para estos tipos de datos requieren en la declaracion que se indique
				--la longitud del tipo de datos
				begin
				set @strSQL_3=@strSQL_3+'('+cast(@lc as varchar(10))+') '		
				end
			set @strSQL_3=@strSQL_3+' DECLARE CUR CURSOR FOR SELECT '+@nomb_campo_clave+','+@nc+' FROM DELETED OPEN CUR FETCH NEXT FROM CUR INTO @ID,@'+@nc
			set @strSQL_3=@strSQL_3+' WHILE @@FETCH_STATUS=0 BEGIN '
			set @strSQL_3=@strSQL_3+' SET @A=CAST(@'+@nc+' AS varchar(200))'
			set @strSQL_3=@strSQL_3+' SET @D=CAST((SELECT '+@nc+' FROM '+@tabla+' WHERE '+@nomb_campo_clave+'=@ID) AS varchar(200)) ' 	
			SET @strSQL_3=@strSQL_3+' SET @AUX1= ISNULL(@A,'+char(39)+'0'+char(39)+') '
			SET @strSQL_3=@strSQL_3+' SET @AUX2= ISNULL(@D,'+char(39)+'0'+char(39)+') '			
			set @strSQL_3=@strSQL_3+' IF @AUX1<> @AUX2 INSERT INTO TB_SUCESOS (ACCION,TABLA,PK_ID,PK_nombre,NOMB_CAMPO_AUDIT,ANTES,DESPUES,FECHASUCESO,BDUSER,SYSUSER) VALUES ('+char(39)+'U'+char(39)+','+char(39)+@tabla+char(39)+',@ID,'+char(39)+@nomb_campo_clave+char(39)+','+char(39)+@nc+char(39)+',@A,@D,GETDATE(),CURRENT_USER,SYSTEM_USER)'
			set @strSQL_3=@strSQL_3+' FETCH NEXT FROM CUR INTO @ID, @'+@nc+' END '
			set @strSQL_3=@strSQL_3+' CLOSE CUR DEALLOCATE CUR END '	
			select @lcad=len(@strSQL_3)+len(@strSQL_2)+len(@strSQL)+len(@strSQL_1)
			--PRINT @STRSQL + @STRSQL_1 + @STRSQL_2 + @STRSQL_3
			goto next_record
			end
		if @lcad>=28000 and @lcad<35000
			begin
			set @strSQL_4=@strSQL_4+' IF UPDATE('+@nc+') BEGIN '
			set @strSQL_4=@strSQL_4+'DECLARE @'+@nc+' '+@td
			if ltrim(rtrim(upper(@td))) in ('CHAR','VARCHAR','NCHAR','NVARCHAR')
				--para estos tipos de datos requieren en la declaracion que se indique
				--la longitud del tipo de datos
				begin
				set @strSQL_4=@strSQL_4+'('+cast(@lc as varchar(10))+') '		
				end
			set @strSQL_4=@strSQL_4+' DECLARE CUR CURSOR FOR SELECT '+@nomb_campo_clave+','+@nc+' FROM DELETED OPEN CUR FETCH NEXT FROM CUR INTO @ID,@'+@nc
			set @strSQL_4=@strSQL_4+' WHILE @@FETCH_STATUS=0 BEGIN '
			set @strSQL_4=@strSQL_4+' SET @A=CAST(@'+@nc+' AS varchar(200))'
			set @strSQL_4=@strSQL_4+' SET @D=CAST((SELECT '+@nc+' FROM '+@tabla+' WHERE '+@nomb_campo_clave+'=@ID) AS varchar(200)) ' 	
			SET @strSQL_4=@strSQL_4+' SET @AUX1= ISNULL(@A,'+char(39)+'0'+char(39)+') '
			SET @strSQL_4=@strSQL_4+' SET @AUX2= ISNULL(@D,'+char(39)+'0'+char(39)+') '			
			set @strSQL_4=@strSQL_4+' IF @AUX1<> @AUX2 INSERT INTO TB_SUCESOS (ACCION,TABLA,PK_ID,PK_nombre,NOMB_CAMPO_AUDIT,ANTES,DESPUES,FECHASUCESO,BDUSER,SYSUSER) VALUES ('+char(39)+'U'+char(39)+','+char(39)+@tabla+char(39)+',@ID,'+char(39)+@nomb_campo_clave+char(39)+','+char(39)+@nc+char(39)+',@A,@D,GETDATE(),CURRENT_USER,SYSTEM_USER)'
			set @strSQL_4=@strSQL_4+' FETCH NEXT FROM CUR INTO @ID, @'+@nc+' END '
			set @strSQL_4=@strSQL_4+' CLOSE CUR DEALLOCATE CUR END '	
			select @lcad=len(@strSQL)+len(@strSQL_1)+len(@strSQL_2)+len(@strSQL_3)+len(@strSQL_4)
			--PRINT @STRSQL + @STRSQL_1 + @STRSQL_2 + @STRSQL_3		
			goto next_record
			end
		next_record:
		fetch next from cols into @ic, @nc, @td, @lc
		end
	
	close cols
	deallocate cols
	--PRINT @strSQL+' '
	--PRINT @strSQL_1 + ' ' 
	--PRINT @strSQL_2 + ' '
	--PRINT @strSQL_3 + ' '
	--PRINT @strSQL_4
	EXECUTE (@strSQL+' '+@strSQL_1 + ' ' +@strSQL_2+' '+@strSQL_3+' '+@strSQL_4)
	if @@error = 0	
		begin
		print 'El trigger de <<Actualización>> fue creado en forma correcta.'
		commit 
		end
	else
		begin 
		rollback
		print 'Ha ocurrido un error al intentar generar el trigger '+@NombTrigger
		end	
	
	set @long=len(@strSQL) + len(@strSQL_1)+len(@strSQL_2)+len(@strSQL_3)+len(@strSQL_4)
	print '		La longitud de la instrucción es: '+cast(@long as varchar(12))
	end --de la condición "IF EVENTO='U' ...
/*************************************************************************************/
IF @evento='D'
	BEGIN
	set @idcol_campo_clave=(select colid from sysindexkeys where id=object_id(@tabla) and indid =(select indid from sysindexes where id=object_id(@tabla) and name like 'PK_'+'%'))
	
	set @nomb_campo_clave=(select name from syscolumns where colid=@idcol_campo_clave and id=object_id(@tabla))
	
	declare @aux2 as varchar(8000)

	set @strSQL=@strSQL + ' DECLARE @ID AS BIGINT '
	set @lcad=len(@strSQL)
	declare cols cursor for
		SELECT colid,name,
		(select name from systypes where xusertype=syscolumns.xtype) as tipo, 
		length FROM syscolumns
		WHERE (id = OBJECT_ID(@tabla)) 
		order by colid
	open cols
	fetch next from cols into @ic, @nc, @td, @lc 
	while @@fetch_status=0
		begin
		
		if @lcad<7000
			begin
			set @strSQL=@strSQL+' DECLARE @'+@NC+'_ANT AS '+@td
			if ltrim(rtrim(upper(@td))) in ('CHAR','VARCHAR','NCHAR','NVARCHAR')
				begin
				set @strSQL=@strSQL + '('+cast(@lc as varchar(10))+') '		
				end
			else
				begin
				set @strSQL=@strSQL + ' ' 
				end		
			set @strSQL=@strSQL+' DECLARE @'+@NC+'_DES AS '+@td
			if ltrim(rtrim(upper(@td))) in ('CHAR','VARCHAR','NCHAR','NVARCHAR')
				begin
				set @strSQL=@strSQL + '('+cast(@lc as varchar(10))+') '		
				end
			else
				begin
				set @strSQL=@strSQL + ' ' 
				end			
			set @strSQL=@strSQL+ ' DECLARE CUR_D CURSOR FOR SELECT '+@nomb_campo_clave+' '
			set @strSQL=@strSQL+','+@nc+' FROM DELETED OPEN CUR_D '
			set @strSQL=@strSQL+' FETCH NEXT FROM CUR_D INTO @ID, @'+@NC+'_ANT '
			set @strSQL=@strSQL+' WHILE @@FETCH_STATUS=0 BEGIN '
			set @strSQL=@strSQL+' SET @'+@NC+'_DES=(SELECT '+@nc+' from '+@tabla+' WHERE '+@nomb_campo_clave+' = '+'@ID) '
			set @strSQL=@strSQL+' INSERT INTO TB_SUCESOS (ACCION,TABLA,PK_ID,PK_nombre,NOMB_CAMPO_AUDIT,ANTES,DESPUES,FECHASUCESO,BDUSER,SYSUSER) VALUES ('+char(39)+'D'+char(39)+','+char(39)+@tabla+char(39)+',@ID,'+char(39)+@nomb_campo_clave+char(39)+','+char(39)+@nc+char(39)+',CAST(@'+@NC+'_ANT AS varchar(200)),CAST(@'+@NC+'_DES AS varchar(200)),GETDATE(),CURRENT_USER,SYSTEM_USER)'
			set @strSQL=@strSQL+' FETCH NEXT FROM CUR_D INTO @ID, @'+@NC+'_ANT END '
			set @strSQL=@strSQL+' CLOSE CUR_D DEALLOCATE CUR_D '	 	
			set @lcad=len(@strSQL)
			goto next_record_D
			end
		if @lcad>=7000 and @lcad<14000
			begin
			
			set @strSQL_1=@strSQL_1+' DECLARE @'+@NC+'_ANT AS '+@td
			if ltrim(rtrim(upper(@td))) in ('CHAR','VARCHAR','NCHAR','NVARCHAR')
				begin
				set @strSQL_1=@strSQL_1 + '('+cast(@lc as varchar(10))+') '		
				end
			else
				begin
				set @strSQL_1=@strSQL_1 + ' ' 
				end		
			set @strSQL_1=@strSQL_1+' DECLARE @'+@NC+'_DES AS '+@td
			if ltrim(rtrim(upper(@td))) in ('CHAR','VARCHAR','NCHAR','NVARCHAR')
				begin
				set @strSQL_1=@strSQL_1 + '('+cast(@lc as varchar(10))+') '		
				end
			else
				begin
				set @strSQL_1=@strSQL_1 + ' ' 
				end			
			set @strSQL_1=@strSQL_1+ ' DECLARE CUR_D CURSOR FOR SELECT '+@nomb_campo_clave+' '
			set @strSQL_1=@strSQL_1+','+@nc+' FROM DELETED OPEN CUR_D '
			set @strSQL_1=@strSQL_1+' FETCH NEXT FROM CUR_D INTO @ID, @'+@NC+'_ANT '
			set @strSQL_1=@strSQL_1+' WHILE @@FETCH_STATUS=0 BEGIN '
			set @strSQL_1=@strSQL_1+' SET @'+@NC+'_DES=(SELECT '+@nc+' from '+@tabla+' WHERE '+@nomb_campo_clave+' = '+'@ID) '
			set @strSQL_1=@strSQL_1+' INSERT INTO TB_SUCESOS (ACCION,TABLA,PK_ID,PK_nombre,NOMB_CAMPO_AUDIT,ANTES,DESPUES,FECHASUCESO,BDUSER,SYSUSER) VALUES ('+char(39)+'D'+char(39)+','+char(39)+@tabla+char(39)+',@ID,'+char(39)+@nomb_campo_clave+char(39)+','+char(39)+@nc+char(39)+',CAST(@'+@NC+'_ANT AS varchar(200)),CAST(@'+@NC+'_DES AS varchar(200)),GETDATE(),CURRENT_USER,SYSTEM_USER)'
			set @strSQL_1=@strSQL_1+' FETCH NEXT FROM CUR_D INTO @ID, @'+@NC+'_ANT END '
			set @strSQL_1=@strSQL_1+' CLOSE CUR_D DEALLOCATE CUR_D '	 	
			set @lcad=len(@strSQL)+len(@strSQL_1)
	
			goto next_record_D
			end
		if @lcad>=14000 and @lcad<21000
			begin
			set @strSQL_2=@strSQL_2+' DECLARE @'+@NC+'_ANT AS '+@td
			if ltrim(rtrim(upper(@td))) in ('CHAR','VARCHAR','NCHAR','NVARCHAR')
				begin
				set @strSQL_2=@strSQL_2 + '('+cast(@lc as varchar(10))+') '		
				end
			else
				begin
				set @strSQL_2=@strSQL_2 + ' ' 
				end		
			set @strSQL_2=@strSQL_2+' DECLARE @'+@NC+'_DES AS '+@td
			if ltrim(rtrim(upper(@td))) in ('CHAR','VARCHAR','NCHAR','NVARCHAR')
				begin
				set @strSQL_2=@strSQL_2 + '('+cast(@lc as varchar(10))+') '		
				end
			else
				begin
				set @strSQL_2=@strSQL_2 + ' ' 
				end			
			set @strSQL_2=@strSQL_2+ ' DECLARE CUR_D CURSOR FOR SELECT '+@nomb_campo_clave+' '
			set @strSQL_2=@strSQL_2+','+@nc+' FROM DELETED OPEN CUR_D '
			set @strSQL_2=@strSQL_2+' FETCH NEXT FROM CUR_D INTO @ID, @'+@NC+'_ANT '
			set @strSQL_2=@strSQL_2+' WHILE @@FETCH_STATUS=0 BEGIN '
			set @strSQL_2=@strSQL_2+' SET @'+@NC+'_DES=(SELECT '+@nc+' from '+@tabla+' WHERE '+@nomb_campo_clave+' = '+'@ID) '
			set @strSQL_2=@strSQL_2+' INSERT INTO TB_SUCESOS (ACCION,TABLA,PK_ID,PK_nombre,NOMB_CAMPO_AUDIT,ANTES,DESPUES,FECHASUCESO,BDUSER,SYSUSER) VALUES ('+char(39)+'D'+char(39)+','+char(39)+@tabla+char(39)+',@ID,'+char(39)+@nomb_campo_clave+char(39)+','+char(39)+@nc+char(39)+',CAST(@'+@NC+'_ANT AS varchar(200)),CAST(@'+@NC+'_DES AS varchar(200)),GETDATE(),CURRENT_USER,SYSTEM_USER)'
			set @strSQL_2=@strSQL_2+' FETCH NEXT FROM CUR_D INTO @ID, @'+@NC+'_ANT END '
			set @strSQL_2=@strSQL_2+' CLOSE CUR_D DEALLOCATE CUR_D '	 	
			set @lcad=len(@strSQL)+len(@strSQL_1)+len(@strSQL_2)
			goto next_record_D
			end
		if @lcad>=21000 and @lcad<28000
			begin
			set @strSQL_3=@strSQL_3+' DECLARE @'+@NC+'_ANT AS '+@td
			if ltrim(rtrim(upper(@td))) in ('CHAR','VARCHAR','NCHAR','NVARCHAR')
				begin
				set @strSQL_3=@strSQL_3 + '('+cast(@lc as varchar(10))+') '		
				end
			else
				begin
				set @strSQL_3=@strSQL_3 + ' ' 
				end		
			set @strSQL_3=@strSQL_3+' DECLARE @'+@NC+'_DES AS '+@td
			if ltrim(rtrim(upper(@td))) in ('CHAR','VARCHAR','NCHAR','NVARCHAR')
				begin
				set @strSQL_3=@strSQL_3 + '('+cast(@lc as varchar(10))+') '		
				end
			else
				begin
				set @strSQL_3=@strSQL_3 + ' ' 
				end			
			set @strSQL_3=@strSQL_3+ ' DECLARE CUR_D CURSOR FOR SELECT '+@nomb_campo_clave+' '
			set @strSQL_3=@strSQL_3+','+@nc+' FROM DELETED OPEN CUR_D '
			set @strSQL_3=@strSQL_3+' FETCH NEXT FROM CUR_D INTO @ID, @'+@NC+'_ANT '
			set @strSQL_3=@strSQL_3+' WHILE @@FETCH_STATUS=0 BEGIN '
			set @strSQL_3=@strSQL_3+' SET @'+@NC+'_DES=(SELECT '+@nc+' from '+@tabla+' WHERE '+@nomb_campo_clave+' = '+'@ID) '
			set @strSQL_3=@strSQL_3+' INSERT INTO TB_SUCESOS (ACCION,TABLA,PK_ID,PK_nombre,NOMB_CAMPO_AUDIT,ANTES,DESPUES,FECHASUCESO,BDUSER,SYSUSER) VALUES ('+char(39)+'D'+char(39)+','+char(39)+@tabla+char(39)+',@ID,'+char(39)+@nomb_campo_clave+char(39)+','+char(39)+@nc+char(39)+',CAST(@'+@NC+'_ANT AS varchar(200)),CAST(@'+@NC+'_DES AS varchar(200)),GETDATE(),CURRENT_USER,SYSTEM_USER)'
			set @strSQL_3=@strSQL_3+' FETCH NEXT FROM CUR_D INTO @ID, @'+@NC+'_ANT END '
			set @strSQL_3=@strSQL_3+' CLOSE CUR_D DEALLOCATE CUR_D '	 	
			set @lcad=len(@strSQL)+len(@strSQL_1)+len(@strSQL_2)+len(@strSQL_3)
			goto next_record_D
			end
		if @lcad>=28000 and @lcad<35000
			begin
			set @strSQL_4=@strSQL_4+' DECLARE @'+@NC+'_ANT AS '+@td
			if ltrim(rtrim(upper(@td))) in ('CHAR','VARCHAR','NCHAR','NVARCHAR')
				begin
				set @strSQL_4=@strSQL_4 + '('+cast(@lc as varchar(10))+') '		
				end
			else
				begin
				set @strSQL_4=@strSQL_4 + ' ' 
				end		
			set @strSQL_4=@strSQL_4+' DECLARE @'+@NC+'_DES AS '+@td
			if ltrim(rtrim(upper(@td))) in ('CHAR','VARCHAR','NCHAR','NVARCHAR')
				begin
				set @strSQL_4=@strSQL_4 + '('+cast(@lc as varchar(10))+') '		
				end
			else
				begin
				set @strSQL_4=@strSQL_4 + ' ' 
				end			
			set @strSQL_4=@strSQL_4+ ' DECLARE CUR_D CURSOR FOR SELECT '+@nomb_campo_clave+' '
			set @strSQL_4=@strSQL_4+','+@nc+' FROM DELETED OPEN CUR_D '
			set @strSQL_4=@strSQL_4+' FETCH NEXT FROM CUR_D INTO @ID, @'+@NC+'_ANT '
			set @strSQL_4=@strSQL_4+' WHILE @@FETCH_STATUS=0 BEGIN '
			set @strSQL_4=@strSQL_4+' SET @'+@NC+'_DES=(SELECT '+@nc+' from '+@tabla+' WHERE '+@nomb_campo_clave+' = '+'@ID) '
			set @strSQL_4=@strSQL_4+' INSERT INTO TB_SUCESOS (ACCION,TABLA,PK_ID,PK_nombre,NOMB_CAMPO_AUDIT,ANTES,DESPUES,FECHASUCESO,BDUSER,SYSUSER) VALUES ('+char(39)+'D'+char(39)+','+char(39)+@tabla+char(39)+',@ID,'+char(39)+@nomb_campo_clave+char(39)+','+char(39)+@nc+char(39)+',CAST(@'+@NC+'_ANT AS varchar(200)),CAST(@'+@NC+'_DES AS varchar(200)),GETDATE(),CURRENT_USER,SYSTEM_USER)'
			set @strSQL_4=@strSQL_4+' FETCH NEXT FROM CUR_D INTO @ID, @'+@NC+'_ANT END '
			set @strSQL_4=@strSQL_4+' CLOSE CUR_D DEALLOCATE CUR_D '	 	
			set @lcad=len(@strSQL)+len(@strSQL_1)+len(@strSQL_2)+len(@strSQL_3)+len(@strSQL_4)
			goto next_record_D
			end
		next_record_D:
		fetch next from cols into @ic, @nc, @td, @lc 
		end
	close cols
	deallocate cols
	
	EXECUTE (@strSQL+' '+@strSQL_1+' '+@strSQL_2+' '+@strSQL_3+' ' +@strSQL_4)
	if @@error = 0	
		BEGIN
		commit 
		PRINT 'El trigger de <<Eliminación>> fue creado correctamente'
		end
	else
		begin 
		rollback
		print 'Ha ocurrido un error al intentar generar el trigger '+@NombTrigger
		end	
	set @long=len(@strSQL) + len(@strSQL_1)+len(@strSQL_2)+len(@strSQL_3)+len(@strSQL_4)
	print '		La longitud de la instrucción es: '+cast(@long as varchar(12))
	
	
	
	
	end

IF @evento='I'
	begin
	set @idcol_campo_clave=(select colid from sysindexkeys where id=object_id(@tabla) and indid =(select indid from sysindexes where id=object_id(@tabla) and name like 'PK_'+'%'))
	
	set @nomb_campo_clave=(select name from syscolumns where colid=@idcol_campo_clave and id=object_id(@tabla))
	set @strSQL=@strSQL + ' DECLARE @ID AS BIGINT '
	set @strSQL=@strSQL+ ' DECLARE CUR_I CURSOR FOR SELECT '+@nomb_campo_clave+' '
	set @strSQL=@strSQL+' FROM INSERTED OPEN CUR_I '
	set @strSQL=@strSQL+' FETCH NEXT FROM CUR_I	INTO @ID WHILE @@FETCH_STATUS=0 BEGIN '
	set @strSQL=@strSQL+' INSERT INTO TB_SUCESOS (ACCION,TABLA,PK_ID,PK_nombre,NOMB_CAMPO_AUDIT,ANTES,DESPUES,FECHASUCESO,BDUSER,SYSUSER) VALUES 
	('+char(39)+'I'+char(39)+','
	+char(39)+@tabla+char(39)+',@ID,'
	+char(39)+@nomb_campo_clave+char(39)+','
	+char(39)+'*****'+char(39)+','
	+char(39)+'*****'+char(39)+','
	+char(39)+'*****'+char(39)+',GETDATE(),CURRENT_USER,SYSTEM_USER)'
		set @strSQL=@strSQL+' FETCH NEXT FROM CUR_I INTO @ID END '
		set @strSQL=@strSQL+' CLOSE CUR_I DEALLOCATE CUR_I '	 	
	execute(@strSQL)
	if @@error=0
		begin
		commit
		print 'El trigger de <<Inserción>> fue creado correctamente'
		end
	else
		begin
		rollback
		print 'Ha ocurrido un error al intentar generar el trigger de inserción!'
		end
	
	set @long=len(@strSQL) 
	print '		La longitud de la instrucción es: '+cast(@long as varchar(12))	
	end -- del If @evento='I' ...
GO
